/* Liest von der Tastatur fortlaufend Zeichen ein, bis ein Enter eingegeben wird
 * Parameter: Eingabepuffer
 * Rückgaben: Eingabepuffer
 */
#include "input.h"

/// Das geht bestimmt anders ... MultiTasking fähig sieht zumindest anders aus
pid_t input_freezed_pid = 0; // PID des eingefrorenen Tasks
static unsigned short gets_pos;
char *gets_buffer;
char getchar_eingabe;

static BOOL input_progress = FALSE;

void gets_handler (struct keyboard_struct *keyb) {
	if (keyb->pressed == TRUE) {
		if (keyb->input == 0x01 || keyb->input == '\n') {
			keyb_remove_handler (gets_handler); // Sich selbst austragen
			gets_buffer[gets_pos] = 0x0;
			//gets_done = TRUE;
			ResumeTask (input_freezed_pid); // Task wieder auftauen
		} else if (keyb->input == '\b') {
			if (gets_pos > 0) {
				gets_pos--;
				gets_buffer[gets_pos] = 0x0;
				print ("\b");
			}
		} else if (keyb->input > 0x02) {
			gets_buffer[gets_pos] = keyb->input;
			gets_pos++;
			printf ("%c", keyb->input);
		}
	}
}

void getchar_handler (struct keyboard_struct *keyb) {
	getchar_eingabe = keyb->input;
	ResumeTask (input_freezed_pid);
}

char *gets (char *eingabe) {
	if (input_progress) {
		return NULL;
	}
	input_progress = TRUE;

	gets_pos = 0;
	gets_buffer = eingabe;
	input_freezed_pid = GetRunningTaskPID (); // PID des laufenden Prozesses holen
	// Nun noch nen Keyboard handler hinzufügen
	keyb_add_handler (gets_handler);
	FreezeTask (input_freezed_pid); // Und ihn einfrieren
	input_progress = FALSE;
	// Da die PID auch gleich die aufrufer PID ist, gehts hier gleich weiter :D
	return eingabe;
}

char getchar () {
	if (input_progress) {
		return 0x0;
	}
	input_progress = TRUE;
	input_freezed_pid = GetRunningTaskPID();
	keyb_add_handler (getchar_handler);
	FreezeTask (input_freezed_pid);
	input_progress = FALSE;
	return getchar_eingabe;
}
